#include "printk.h"

// extern struct position Pos;
void Start_Kernel(void)
{
	//一个虚拟地址 共64位，其中低48位为有效位，高16位全部置0或1
	//39-47 PML4E表索引
	//30-38 PDPTE表索引
	//21-29 PDE表索引
	//12-20 PTE表索引

	//内存分页分为4KB,2MB,1G
	//4KB的就不赘述了
	//2MB,此时PDE表从21位取到51位, 此时，虚拟地址后面的全是偏移，所以，没有PTE表了
	//4KB,此时PDE表项的物理地址从12位取到51位,然后左移12位 + PTE表的索引 * 8 --> 物理页地址
	//1GB,此时PDE表项从30位取到51位,此时，虚拟地址后面的全是偏移，所以，没有PDE和PTE表了
	//0xa00000->去掉低12位->0xa00= 00 0000 101 << 9 + 0 0000 0000 => 这个地址在PDE表的第5项
	//PDE表的第5项为 0xe0000083 因为是大内存页，所以，将低21位置0，就是真实的物理地址
	//因为比较复杂，怕自己忘了，所以写在这里

	int* addr = (int*)0xffff800000a00000;
	int i;
	for(i = 0;i < 800 * 20;i++){
		*((char*)addr + 0) = (char)0x00;
		*((char*)addr + 1) = (char)0x00;
		*((char*)addr + 2) = (char)0xff;
		*((char*)addr + 3) = (char)0x00;
		addr++;
	}

	for(i = 0;i < 800 * 20;i++){
		*((char*)addr + 0) = (char)0x00;
		*((char*)addr + 1) = (char)0xff;
		*((char*)addr + 2) = (char)0x00;
		*((char*)addr + 3) = (char)0x00;
		addr++;
	}	

	for(i = 0;i < 800 * 20;i++){
		*((char*)addr + 0) = (char)0xff;
		*((char*)addr + 1) = (char)0x00;
		*((char*)addr + 2) = (char)0x00;
		*((char*)addr + 3) = (char)0x00;
		addr++;
	}	

	for(i = 0;i < 800 * 20;i++){
		*((char*)addr + 0) = (char)0xff;
		*((char*)addr + 1) = (char)0xff;
		*((char*)addr + 2) = (char)0xff;
		*((char*)addr + 3) = (char)0x00;
		addr++;
	}
	int aa = 34;
	aa++;	

	color_printk(YELLOW,BLACK,"Hello\t\t World!\n");

	while(1)
		;


}